home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 21 / CU Amiga Magazine's Super CD-ROM 21 (1998)(EMAP Images)(GB)[!][issue 1998-04].iso / CUCD / Programming / Python-1.4 / Source / Amiga / Python_netlib / wbargs.c < prev   
C/C++ Source or Header  |  1997-01-02  |  4KB  |  156 lines

  1. /* Copyright (c) 1993 SAS Institute, Inc, Cary, NC USA */
  2. /* All Rights Reserved */
  3.  
  4. /* Adapted for Python1.4 by Irmen de Jong, 28 dec. 1996 */
  5.  
  6. #include <workbench/startup.h>
  7. #include <exec/execbase.h>
  8. #include <string.h>
  9. #include <dos.h>
  10. #include <stdlib.h>
  11.  
  12. #include <proto/dos.h>
  13. #include <proto/exec.h>
  14. #include <proto/icon.h>
  15.  
  16. /* These two symbols, _WBArgc and _WBArgv, are initialized if     */
  17. /* the program was invoked from WorkBench.  They look like normal */
  18. /* C (argc, argv) parameters.  The parameters are gathered as     */
  19. /* follows:                                                       */
  20. /*   Name of the program                                          */
  21. /*   Any tooltypes specified in the ToolTypes array               */
  22. /*   Any icons supplied as arguments (with SHIFT-CLICK)           */
  23.  
  24. int _WBArgc;       /* Count of the number of WorkBench arguments */
  25. char **_WBArgv;    /* The actual arguments                       */
  26.  
  27. static int _WBArgMax;  /* Internal: tells us how much space is left */
  28.                        /* in _WBArgv.                               */
  29.  
  30. // NAME:    FullName
  31. // PURPOSE: get the full pathname of a file.
  32. static void FullName(BPTR parent, char *name, char *buf, int len)
  33. {
  34.     int i = 0;
  35.     if(NameFromLock(parent, buf, len-1))
  36.     {
  37.         i = strlen(buf);
  38.         if(buf[i-1] != ':' && buf[i-1] != '/')
  39.         {
  40.             buf[i++] = '/';
  41.             buf[i] = 0;
  42.         }
  43.     }
  44.  
  45.     if(i < len-1) strncpy(buf+i, name, len-i-1);
  46.     return;
  47. }
  48.  
  49. /* Add an argument to the _WBArgv array.  We must allocate */
  50. /* memory for the argument and copy the incoming data.     */
  51. static int AddArg(char *arg)
  52. {
  53.     if(_WBArgc >= _WBArgMax-1)
  54.     {
  55.         /* Out of space in _WBArgv.  Reallocate it bigger. */
  56.         _WBArgMax += 10;
  57.         _WBArgv = realloc(_WBArgv, _WBArgMax*sizeof(char *));
  58.         if(_WBArgv == NULL) return -1;
  59.     }
  60.  
  61.     /* Allocate memory for the new argument */
  62.     _WBArgv[_WBArgc] = malloc(strlen(arg)+1);
  63.     if(_WBArgv[_WBArgc] == NULL) return -1;
  64.  
  65.     /* Copy the argument data over */
  66.     strcpy(_WBArgv[_WBArgc], arg);
  67.  
  68.     /* Increment our argument count */
  69.     _WBArgc++;
  70.  
  71.     return 0;
  72. }
  73.  
  74. /* This is an autoinitializer routine that will be run if this  */
  75. /* module is linked in to user code.  Referring to the external */
  76. /* data items above is sufficient to pull this in from a library*/
  77.  
  78. int __stdargs _STI_20000_WBArgParse(void)
  79. {
  80.     struct WBArg *wba;
  81.     int nargs;
  82.     char buf[512];
  83.     struct DiskObject *dob;
  84.     struct Library *IconBase;
  85.     BPTR dir;
  86.  
  87.     if(_WBenchMsg == NULL) return 0;  // Not invoked from WorkBench
  88.  
  89.     /* Put the program name in */
  90.     wba=_WBenchMsg->sm_ArgList;
  91.     FullName(wba->wa_Lock, wba->wa_Name, buf, sizeof(buf));
  92.     if(AddArg(buf)) return -1;
  93.  
  94.     /* Find the tool types and add them */
  95.  
  96.     if(IconBase = OpenLibrary("icon.library", 0L))
  97.     {
  98.         dir = CurrentDir(wba->wa_Lock);
  99.         if(dob = GetDiskObject(wba->wa_Name))
  100.         {
  101.             if(dob->do_ToolTypes)
  102.             {
  103.                 for(nargs=0; dob->do_ToolTypes[nargs]; nargs++)
  104.                     if(AddArg(dob->do_ToolTypes[nargs])) return -1;
  105.             }
  106.             FreeDiskObject(dob);
  107.         }
  108.         CurrentDir(dir);
  109.         CloseLibrary(IconBase);
  110.     }
  111.  
  112.  
  113.     /* Now add the file arguments */
  114.     /* For Python1.4, also insert the tooltypes of the first file (if any) */
  115.     for(nargs=1, wba++; 
  116.         nargs<_WBenchMsg->sm_NumArgs;
  117.         nargs++, wba++)
  118.     {
  119.         if(nargs==1)
  120.         {
  121.             if(IconBase = OpenLibrary("icon.library", 0L))
  122.             {
  123.                 dir=CurrentDir(wba->wa_Lock);
  124.                 if(dob = GetDiskObject(wba->wa_Name))
  125.                 {
  126.                     if(dob->do_ToolTypes)
  127.                     {
  128.                         int i;
  129.                         for(i=0; dob->do_ToolTypes[i]; i++)
  130.                             if(AddArg(dob->do_ToolTypes[i])) return -1;
  131.                     }
  132.                     FreeDiskObject(dob);
  133.                 }
  134.                 CurrentDir(dir);
  135.                 CloseLibrary(IconBase);
  136.             }
  137.         }
  138.  
  139.         FullName(wba->wa_Lock, wba->wa_Name, buf, sizeof(buf));
  140.         {
  141.             BPTR test=Lock(buf,ACCESS_READ);
  142.             if(test)
  143.             {
  144.                 UnLock(test);
  145.                 if(AddArg(buf)) return -1;
  146.             }
  147.         }
  148.     }
  149.  
  150.     /* Make sure _WBArgv is terminated with a NULL pointer */
  151.     /* like ANSI C argv lists are.                         */
  152.     _WBArgv[_WBArgc] = NULL;
  153.  
  154.     return 0;
  155. }
  156.